//
//  IMAPIManager.h
//  DualMediationSDK
//
//  Created by YeJary on 2025/6/23.
//

#import <Foundation/Foundation.h>
#import <Foundation/Foundation.h>
#import "IMAPIConfig.h"

NS_ASSUME_NONNULL_BEGIN

// 前向声明
@class IMLoginService;

// 常量定义
extern NSString * const IMLoginStatusKey;
extern NSString * const IMLoginUserUUIDKey;
extern NSString * const IMLoginTimestampKey;
extern NSString * const IMLoginErrorKey;

// 通知名称
extern NSString * const IMLoginStatusDidChangeNotification;

// 配置回调
typedef void(^IMConfigurationBlock)(BOOL success, NSError * _Nullable error);

/**
 * API管理器 - 统一API入口
 * 
 * 核心职责：
 * 1. 统一管理所有API接口
 * 2. 配置管理和维护
 * 3. 网络层封装
 * 4. 错误处理和重试机制
 */
@interface IMAPIManager : NSObject

#pragma mark - 属性

/**
 * API配置对象
 */
@property (nonatomic, strong, readonly) IMAPIConfig *apiConfig;

/**
 * 登录服务对象
 */
@property (nonatomic, strong, readonly) IMLoginService *loginService;

/**
 * 是否已初始化
 */
@property (nonatomic, assign, readonly) BOOL isInitialized;

#pragma mark - 单例

/**
 * 获取单例实例
 */
+ (instancetype)sharedManager;

#pragma mark - 配置管理

/**
 * 配置API管理器
 * @param baseURL 基础URL
 * @param appID 应用ID
 */
- (void)configureWithBaseURL:(NSString *)baseURL appID:(NSString *)appID;

/**
 * 使用配置对象配置API管理器
 * @param config 配置对象
 */
- (void)configureWithConfig:(IMAPIConfig *)config;

/**
 * 配置API管理器（完整参数）
 * @param baseURL 生产环境URL
 * @param debugBaseURL 调试环境URL
 * @param appID 应用ID
 * @param isDebugMode 是否使用调试模式
 */
- (void)configureWithBaseURL:(NSString *)baseURL
                debugBaseURL:(NSString * _Nullable)debugBaseURL
                       appID:(NSString *)appID
                 isDebugMode:(BOOL)isDebugMode;

/**
 * 获取当前配置
 */
- (IMAPIConfig *)currentConfig;

/**
 * 检查是否已配置
 */
- (BOOL)isConfigured;


#pragma mark - 网络配置

/**
 * 设置请求超时时间
 * @param timeout 超时时间（秒）
 */
- (void)setRequestTimeout:(NSTimeInterval)timeout;

/**
 * 设置最大重试次数
 * @param maxRetryCount 最大重试次数
 */
- (void)setMaxRetryCount:(NSInteger)maxRetryCount;

/**
 * 设置请求头
 * @param headers 请求头字典
 */
- (void)setDefaultHeaders:(NSDictionary<NSString *, NSString *> *)headers;

#pragma mark - 状态查询

/**
 * 获取SDK版本
 */
- (NSString *)sdkVersion;

/**
 * 获取网络状态
 */
- (BOOL)isNetworkAvailable;

#pragma mark - 用户状态查询

/**
 * 检查用户是否已登录
 */
- (BOOL)isUserLoggedIn;

/**
 * 获取当前用户UUID
 */
- (nullable NSString *)getCurrentUserUUID;



/**
 * 获取登录状态描述
 * @return 登录状态描述字符串
 */
- (NSString *)getLoginStatusDescription;

/**
 * 获取用户登录信息
 * @return 用户登录信息字典
 */
- (nullable NSDictionary *)getUserLoginInfo;

/**
 * 检查并刷新登录状态
 * @param completion 完成回调
 */
- (void)checkAndRefreshLoginWithCompletion:(void(^)(BOOL success, NSError * _Nullable error))completion;

/**
 * 获取环境信息
 * @return 环境信息字典
 */
- (NSDictionary *)getEnvironmentInfo;

#pragma mark - 登录接口

/**
 * 用户登录
 * @param appId 应用ID
 * @param iosUuid iOS设备唯一标识
 * @param countryCode 地区代码（可选）
 * @param success 成功回调
 * @param failure 失败回调
 */
- (void)loginWithAppId:(NSString *)appId
              iosUuid:(NSString *)iosUuid
          countryCode:(NSString * _Nullable)countryCode
              success:(void(^)(NSDictionary *responseData))success
              failure:(void(^)(NSError *error))failure;

/**
 * 用户登出
 */
- (void)logout;

@end

NS_ASSUME_NONNULL_END
